﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace EWS
{
    public partial class Gui : Form
    {
        private WardClient wardClient;
        private FlashWarning flashREDWarning;
        private Bitmap greenPic;
        private Bitmap orangePic;
        private Bitmap yellowPic;
        private Bitmap redPic;

        public Gui()
        {
            InitializeComponent();
            wardClient = new WardClient((int)numericUpDownWardNumber.Value);

            greenPic = new Bitmap(global::EWS.Properties.Resources.greenWS);
            orangePic = new Bitmap(global::EWS.Properties.Resources.orangeWS);
            redPic = new Bitmap(EWS.Properties.Resources.redWS);
            yellowPic = new Bitmap(global::EWS.Properties.Resources.yellowWS);

        }

        private void Gui_Load(object sender, EventArgs e)
        {
            wardClient.WardNumber = (int)numericUpDownWardNumber.Value;
            PopulateDataGridView();
        }

        // TODO: beim klicken auf eine zeile im dataGridView sollte sich ein neues Fenster öffnen,
        // das die messdaten + doktor + schwester zeigt
        // die kompletten daten zu einem bett sind sortiert nach bettnummer in wardClient.BedsList abrufbar
        // d.h. man kann einfach mit dem wert der spalte bettnummer aus dem dataGridView ein bett aus der Liste holen
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {

                // zeige jetzt details der einzelnen messwerte von angeklickter zeile


                int bedNum = (int)dataGridView1["BedNumber", e.RowIndex].Value;


                MessageBox.Show("Details zu Bett " + bedNum + ":\n"
                    + "\nPulse:\t\t" + wardClient.BedsList[bedNum].MeasureData.Pulse + "\tbpm"
                    + "\nBlutdruck:\t\t" + wardClient.BedsList[bedNum].MeasureData.bpdata.Sys + "/" + wardClient.BedsList[bedNum].MeasureData.bpdata.Dia + "\tmmHg"
                    + "\nSauerstoffsättigung:\t" + wardClient.BedsList[bedNum].MeasureData.OxygenSaturation + "\t%"
                    + "\nAtemfrequenz:\t" + wardClient.BedsList[bedNum].MeasureData.ResperatoryRate + "\trpm"
                    + "\nKörpertemperatur:\t" + wardClient.BedsList[bedNum].MeasureData.Temperature + "\t°C"
                    + "\n\n(STAND:  " + wardClient.BedsList[bedNum].MeasureData.CreationTime + ")");
            }
        }

        private void closeApplicationToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void connectToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // TODO: NIX? DBConnection connected/disconnected sowieso automatisch
        }

        private void disconnectToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // TODO: NIX? DBConnection connected/disconnected sowieso automatisch
        }

        private void newNurseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                NewNurseDialog dialog = new NewNurseDialog();
                DialogResult dialogResult = dialog.ShowDialog();
                if (dialogResult == DialogResult.OK)
                {
                    if (isUserInputOk(dialog.NurseName))
                    {
                        if (!wardClient.Connection.insertNurse(dialog.NurseName))
                        {
                            MessageBox.Show("Keine Schwester eingefügt (kein gültiger Name)!");
                        }
                    }
                    else
                        MessageBox.Show("Ungültige Eingabe!");
                }
                dialog.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler beim Einfügen der Schwester!\n" + ex.Message);
            }
        }

        private void newDoctorToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                NewDocDialog dialog = new NewDocDialog();
                DialogResult dialogResult = dialog.ShowDialog();
                if (dialogResult == DialogResult.OK)
                {

                    if (isUserInputOk(dialog.DocName))
                    {

                        if (!wardClient.Connection.insertDoc(dialog.DocName))
                        {
                            MessageBox.Show("Kein Doktor eingefügt (kein gültiger Name)!");
                        }

                    }
                    else
                        MessageBox.Show("Ungültige Eingabe!");
                }
                dialog.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler beim Einfügen des Doktors!\n" + ex.Message);
            }
        }

        private void newBedButtonClick(object sender, EventArgs e)
        {
            openNewBedDialog();
        }



        private void newBedToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openNewBedDialog();
        }

        private void openNewBedDialog()
        {
            try
            {
                NewBedDialog dialog = new NewBedDialog(wardClient.WardNumber);
                DialogResult dialogResult = dialog.ShowDialog();
                if (dialogResult == DialogResult.OK)
                {

                    if (isUserInputOk("" + dialog.BedNumber + dialog.PkNurse + dialog.PkDoctor))
                    {
                        // information über neues bett in wardClient merken
                        if (!wardClient.addNewBed(dialog.BedNumber, dialog.PkNurse, dialog.PkDoctor))
                        {
                            MessageBox.Show("Kein neues Bett angelegt! Bettnummer ist bereits belegt!");
                        }
                    }
                    else
                        MessageBox.Show("Ungültige Eingabe!");
                }
                dialog.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler beim Erstellen des Bettes!\n" + ex.Message);
            }
        }



        private void PopulateDataGridView()
        {
            // neueste Betten aus Datenbank holen
            wardClient.update();
            // fülle datagridview
            SortedList<int, Bed> dataToGrid = wardClient.BedsList;
            int i = 0;
            Bitmap currentPic = null;
            List<KeyValuePair<int, String>> doctorsList = new List<KeyValuePair<int, string>>();
            List<KeyValuePair<int, String>> nursesList = new List<KeyValuePair<int, string>>();
            int bedNumber;
            String docName;
            String nurseName;

            foreach (KeyValuePair<int, Bed> item in dataToGrid)
            {
                bedNumber = wardClient.BedsList[item.Key].BedNumber;
                docName = wardClient.BedsList[item.Key].Doctor;
                nurseName = wardClient.BedsList[item.Key].Nurse;

                switch (item.Value.WarningStep)
                {
                    case warningColor.green:
                        currentPic = greenPic;
                        break;
                    case warningColor.yellow:
                        currentPic = yellowPic;
                        break;
                    case warningColor.orange:
                        currentPic = orangePic;
                        nursesList.Add(new KeyValuePair<int, string>(bedNumber, nurseName));
                        break;
                    case warningColor.red:
                        currentPic = redPic;
                        doctorsList.Add(new KeyValuePair<int, string>(bedNumber, docName));
                        break;
                    default:
                        currentPic = null;
                        break;
                }



                dataGridView1.Rows.Insert(i++, item.Key, currentPic, item.Value.MeasureData.CreationTime);

                // pro Zeile gleicher Tooltip für alle (3) Spalten
                for (int j = 0; j < 3; j++)
                {
                    dataGridView1.Rows[i - 1].Cells[j].ToolTipText = "Bettnummer " + item.Key +
                                                                     "\n\nPuls: " + wardClient.BedsList[item.Key].MeasureData.Pulse + " bpm" +
                                                                     "\nBlutdruck: " + wardClient.BedsList[item.Key].MeasureData.bpdata.Sys + "/" + wardClient.BedsList[item.Key].MeasureData.bpdata.Dia + " mmHg" +
                                                                     "\nSauerstoffsättigung: " + wardClient.BedsList[item.Key].MeasureData.OxygenSaturation + " %" +
                                                                     "\nAtemfrequenz: " + wardClient.BedsList[item.Key].MeasureData.ResperatoryRate + " rpm" +
                                                                     "\nKörpertemperatur: " + wardClient.BedsList[item.Key].MeasureData.Temperature + " °C" +
                                                                     "\n\nStand: " + wardClient.BedsList[item.Key].MeasureData.CreationTime;
                }

            }
            /* Warning Fenster mit Ausgabe von Doktoren und Bettnummern */
            if (doctorsList.Count > 0)
            {
                flashREDWarning = new FlashWarning(doctorsList);
                flashREDWarning.ShowDialog();
            }

            // falls die liste nicht leer ist, soll sich eine MessageBox
            // als Warnung an die Schwestern öffnen
            if (nursesList.Count > 0)
            {
                new FlashWarningNurse(nursesList);
            }
        }

        private void numericUpDownWardNumber_ValueChanged(object sender, EventArgs e)
        {
            wardClient.WardNumber = (int)numericUpDownWardNumber.Value;

            // zeichne grid auch nach stationswechsel neu
            dataGridView1.Rows.Clear();
            PopulateDataGridView();
        }

        private void refreshGridbuttonUpdate_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();
            PopulateDataGridView();
        }


        private void timerGetNewDataFromDB_Tick(object sender, EventArgs e)
        {
            // zeichne datagridview neu
            dataGridView1.Rows.Clear();
            PopulateDataGridView();
        }

        // stündlich neue Messdaten generieren und in der Datenbank speichern
        private void timerStore2DB_Tick(object sender, EventArgs e)
        {
            wardClient.store2DB();
        }

        private bool isUserInputOk(string tmp)
        {
            string pat = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÄÖÜäöüß. ";
            foreach (char ch in tmp)
            {
                if (pat.IndexOf(ch) < 0)
                    return false;
            }
            return true;
        }

    }
}
